package com.up360.rapidcalc.aerolite.servers
{
    import com.up360.rapidcalc.aerolite.AeroliteCrisis;
    import com.up360.rapidcalc.aerolite.model.Aerolite;
    import com.up360.rapidcalc.aerolite.model.Subject;
    import com.up360.rapidcalc.aerolite.util.Collection;
    
    import flash.display.DisplayObject;
    import flash.events.TimerEvent;
    import flash.geom.Point;
    import flash.utils.Timer;
    
    /**
     * @author Tunie
     * @date   May 3, 2013
     * 陨石业务类
     * 1.根据现有陨石随机取得一个题干randomTopic
     */
    public class AerolitesServer extends Collection
    {
        /**
         *陨石最大个数 
         */
        public static const MAX_LENGTH:int=5;
        /**
         *警戒线 
         */
        public static const CORDON:int=500;
        /**
         *计时器延迟 
         */
        public static const DELAY:Number=10;
        /**
         *当前题干，对应的陨石
         */
        public var topic:int;
        
        /**
         *陨石服务对象 
         */
        public var aeroliteServer:AeroliteServer;
        
        private var _timer:Timer;
        
        
        public function AerolitesServer()
        {
            super();
            aeroliteServer=new AeroliteServer();
            setupTimer();
        }
        
       
        
        override public function add(obj:Object):void
        {
            if(!obj is Aerolite) return;
            if(_length<MAX_LENGTH)
            {
                super.add(obj);
            }
        }
		
		
		
        /**
         * 根据现有陨石随机取得一个题干
         */
        private function randomTopic():void
        {
            //若陨石集为空，刚设置topic为-1，并且暂停计数器
            if(isEmpty()) 
            {
                topic=-1;
                _timer.stop();
                return;
            }
            //若陨石只剩下最后一个，直接返回
            if(_length==1) 
            {
                topic=0;
                return;
            }
            //对数组排序
            _elements.sortOn("costedTime",Array.NUMERIC|Array.DESCENDING);
            //判断离炮台最近的陨石是否超过了警戒线
            if(checkCordon()) 
            {
                topic=0;
                return;
            }
            //计算陨石所花时间的总共以求出各陨石所占比例
            var b_costTotal:Number=getCostTotal();
            if(b_costTotal==0)
            {
                topic=0;
                return;
            }
            var b_rate:Array=new Array();
            for each(var obj:Object in _elements)
            {
                b_rate.push((obj as Aerolite).costedTime/b_costTotal);
            }
            //对比例数组进行累加处理
            for(var i:int=1;i<_length;i++)
            {
                b_rate[i]+=b_rate[i-1];
            }
            //随机生成一个0-100的数字，
            var b_random:Number=Math.random();
            //根据随机生成的数字及各陨石比例数值，按比率取得对应陨石上的题目的题干了。
            for(var j:int=0;j<_length;j++)
            {
                if(b_random<=b_rate[j]) break;
            }
            //
            topic=j;
        }
        
        /**
         * 指定topic对应的陨石
         * @return 
         */
        public function curAerolite():Aerolite
        {
            return get(topic) as Aerolite;
        }
        /**
         * 当前题干对应的试题 
         * @return 
         * 
         */
        public function curSubject():Subject
        {
            return curAerolite().answer;
        }
        /**
         *当前题干 
         * @return 
         */
        public function curTopic():String
        {
            randomTopic();
            if(topic>=0)
            {
                return curSubject().topic;
            }
            else
            {
                return "";
            }
        }
        /**
         *当前答题 
         * @return 
         * 
         */
        public function curAnswer():String
        {
            return curSubject().rightAnswer();
        }
        
        public function start():void
        {
            _timer.start();
        }
        public function stop():void
        {
            _timer.stop();
        }
		/**
		 * 判断新增的陨石位置是否与已有陨石重叠，若重叠,则返回true。
		 * @param obj
		 */
		public function testHit(aero:Aerolite):Boolean
		{
            if(_length==0) return false;
            for each(var obj:Aerolite in _elements)
            {
                if(aero.hitTestObject(obj))
                {
                    return true;
                }
            }
			return false;
		}
		
		/**
         * 判断离炮台最近的陨石是否超过了警戒线
         * @return 布尔值,若超过，则返回True
         */
        private function checkCordon():Boolean
        {
            var b_aero:Aerolite=_elements[0] as Aerolite;
            var b_remainTime:Number=b_aero.hitTime-b_aero.costedTime;
            return b_remainTime<CORDON;
        }
        
        /**
         * 取得集合内部陨石所花时间的总和。
         * @return 
         */
        private function getCostTotal():Number
        {
            var b_total:Number=0;
            for each(var obj:Object in _elements)
            {
                b_total+=(obj as Aerolite).costedTime;
            }
            return b_total;
        }
        
        private function setupTimer():void
        {
            _timer=new Timer(DELAY);
            _timer.addEventListener(TimerEvent.TIMER,timerHandler);
        }
        
        protected function timerHandler(event:TimerEvent):void
        {
            if(_length>0)
            {
                for(var i:int=0;i<_length;i++)
                {
                    aeroliteServer.aerolite=get(i) as Aerolite;
                    aeroliteServer.move();
                }
            }
        }
        
    }
}